    Ext.Hash = function(obj){  
        if(obj){  
            this.data = obj;  
        }else{  
            this.data = {};  
        }  
    };  
    Ext.apply(Ext.Hash.prototype, {  
        /** 
         * <b>向Hash中添加一个键值对,或覆盖已有的键值对的值</b> 
         * @param key (String) 要添加或修改的键 
         * @param value (String) 要添加或修改的值 
         * @return (Ext.Hash) set后返回对象本身（为了支持new Ext.Hash().set('a','a').set('b','b').set.....） 
         */  
        set : function(key,value){  
            if (!this.data[key] || this.data.hasOwnProperty(key)) this.data[key] = value;  
            return this;  
        },  
        /** 
         * <b>获取Hash中指定键的值</b> 
         * @param value (string) 键 
         * @return (String)获取Hash中指定键的值 
         */  
        get : function(key){  
            return (this.data.hasOwnProperty(key)) ? this.data[key] : null;  
        },  
        /** 
         * <b>检测Hash中是否已存在指定的键</b> 
         * @param value (string) 键 
         * @return (boolean) 如果指定的键在Hash中存在,则返回true; 否则返回false 
         */  
        contains : function(key){  
            return this.get(key) == null?false:true  
        },  
        /** 
         * <b>从Hash中删除指定的键</b> 
         * @param value (string) 键 
         * @return (Ext.Hash) remove后返回对象本身（为了支持new Ext.Hash().remove('a','a').remove('b','b').remove.....） 
         */  
        remove : function(key){  
            delete this.data[key];  
            return this;  
        },  
        /** 
         * <b>返回一个Hash中包含的所有键的数组</b><br> 
         * 数组中键的排列顺序和Ext.Hash:getValues方法所返回的值数组的顺序是一一对应的 
         * @return (array) Hash中包含的所有键的数组 
         */  
        getKeys : function(){  
            var arr = [];  
            for(var key in this.data){  
                arr.push(key);  
            }  
            return arr;  
        },  
        /** 
         * <b>返回一个Hash中包含的所有值的数组</b><br> 
         * 数组中键的排列顺序和Ext.Hash:getKeys方法所返回的值数组的顺序是一一对应的 
         * @return (array) Hash中包含的所有值的数组 
         */  
        getValues : function(){  
            var keys = this.getKeys();  
            var arr = [];  
            for(var i=0,j=keys.length;i<j;i++){  
                arr.push(this.data[keys[i]]);  
            }  
            return arr;  
        },  
        /** 
         * <b>取得Hash键值对数量</b> 
         */  
        getLength : function(){  
            return this.getKeys().length;  
        },  
        /** 
         * <b>对Hash中的键值对进行迭代</b> 
         */  
        each : function(fn, bind){  
            for (var key in this.data){  
                if (this.contains(key)) fn.call(bind, this.data[key], key, this);  
            }  
        },  
        /** 
         * <b>由Hash中的键值对生成一个查询字符串(这些值都经过URI编码)</b> 
         */  
        toQueryString : function(){  
            var queryString = [];  
            Ext.each(this.getKeys(), function(key,index,allItem){  
                var result;  
                var value = this.get(key);  
                //if (baseStr) key = baseStr + '[' + key + ']';  
                switch(Ext.type(value)){  
                    case 'object':  
                        var qs = {};  
                        var i=0;  
                        for(var v in value){  
                            if(Ext.type(value[v])!='function'){  
                                qs[key+"."+v] = value[v];  
                                i++;  
                            }  
                        }  
                        result = new Ext.Hash(qs).toQueryString();  
                        break;  
                    case 'array':  
                        var qs = {};  
                        var i=0;  
                        for(var v in value){  
                            if(Ext.type(value[v])!='function'){  
                                qs[key+"["+i+"]"] = value[v];  
                                i++;  
                            }  
                        }  
                        result = new Ext.Hash(qs).toQueryString();  
                        break;  
                    case 'number':    //如果传入的是数字  
                    case 'string':    //如果传入的是字符串  
                    case 'boolean':   //如果传入的是布尔值  
                    case 'whitespace'://如果传入的是DOM Text，且是空格  
                        result = key + '=' + encodeURIComponent(value);  
                }  
                if (value != undefined) queryString.push(result);  
            },this);  
            return queryString.join('&');  
        }  
    });  